/*
 * @lc app=leetcode.cn id=1143 lang=javascript
 *
 * [1143] 最长公共子序列
 *
 * 如果 text1[i-1] === text2[j-1]，说明当前字符可以加入公共子序列，因此 dp[i][j] 应该比 dp[i-1][j-1] 大 1。
 * 如果 text1[i-1] !== text2[j-1]，说明当前字符不能同时加入公共子序列，我们需要从两个方向中选择最大值：
 * 忽略 text1 的当前字符，看 text1 的前 i-1 个字符和 text2 的前 j 个字符的 LCS 长度，即 dp[i-1][j]。
 * 忽略 text2 的当前字符，看 text1 的前 i 个字符和 text2 的前 j-1 个字符的 LCS 长度，即 dp[i][j-1]。
 */

// @lc code=start
/**
 * @param {string} text1
 * @param {string} text2
 * @return {number}
 */
var longestCommonSubsequence = function (text1, text2) {
  const m = text1.length;
  const n = text2.length;
  // text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列的长度。
  const lengths = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
      if (text1[i - 1] === text2[j - 1]) {
        lengths[i][j] = lengths[i - 1][j - 1] + 1;
      } else {
        lengths[i][j] = Math.max(lengths[i][j - 1], lengths[i - 1][j]);
      }
    }
  }
  return lengths[m][n];
};
// @lc code=end
